package visu;

import java.util.ArrayList;
import java.util.List;

import util.DistancesEtDirections;

/**
 * @author COLLET Philippe
 * @author gnpt
 */
public abstract class PerceptionAble implements Dirigeable {
	/**
	 * Accesseur pour le champ de vue.
	 * 
	 * @return le champs de vue.
	 */
	public abstract float getChampDeVue();

	/**
	 * Accesseur pour la longueur de vue associée à la bébête.
	 * 
	 * @return la longueur de vue associée à la bébête.
	 */
	public abstract int getLongueurDeVue();

	/**
	 * Renvoie la liste des entités positionnables vues sur le champ en fonction
	 * du champs de vue.
	 * 
	 * @return la liste des entités positionnables vues sur le champ en fonction
	 *         du champs de vue.
	 */
	public List<? extends Positionnable> getChosesVues() {
		ArrayList<Positionnable> output = new ArrayList<Positionnable>();
		for (Positionnable p : getChamp().getPositionnables()) {
			if (p != this) {
				float dirAngle = DistancesEtDirections.directionDepuisUnPoint(
						p, getX(), getY(), getDirectionCourante());
				if (Math.abs(dirAngle) < (getChampDeVue() / 2)) {
					if (DistancesEtDirections.distanceDepuisUnPoint(p.getX(), p
							.getY(), getX(), getY()) <= getLongueurDeVue()) {
						output.add(p);
					}
				}
			}
		}
		return output;
	}
}
